问题描述:使用数组法解决约瑟夫环问题
约瑟夫入狱,监狱内共有33个犯人。某日33名犯人围成一圈,从第一个犯人开始报数,报到数字7的犯人出列,被枪毙,下一名犯人重新从1开始报数。依次类推,直至剩下最后1名犯人可被赦免。聪明的约瑟夫在心里稍加计算,算出了最后枪毙的位置,他站在这个位置,最终避免了自己被枪毙,逃出升天。
问:约瑟夫算出的是哪个位置?
解决方案提示:对于约瑟夫环问题来说,需要解决4个问题
⒈需要一个长度为33的数组,数组内需要存储什么?
⒉如何解决数组循环的问题?
⒊如何解决“逢7一杀”这个逻辑?
⒋如何处理“已死之人”?
代码:#include<stdio.h>
int main()
{
int fanren[33]={0};//用0/1表示犯人是否存活,0表示存活,1表示死亡
int i,j,k=-1;
for(i=0;i<32;i++)//外层循环表示要枪毙32个犯人
{
for(j=0;j<7;j++)//内层循环表示每隔7个犯人
{
k++;//表示当前犯人下标
if(k==33)//越界处理
k=0;
if(fanren[k]==1)//如果该犯人已死,则应在报数中-1
j--;
}
fanren[k]=1;//找到第7个犯人
printf("第%d号已被枪毙\n",k+1);
}
for(i=0;i<33;i++)
{
if(fanren[i]==0)//跳过所有已被枪毙的犯人
printf("第%d号存活\n",i+1);
}
return 0;
}